package com.ksyun.campus.metaserver.services.impl;

import com.ksyun.campus.metaserver.services.IMetaService;
import com.ksyun.campus.metaserver.services.IMetaServerInitService;
import com.ksyun.campus.metaserver.services.MetadataSyncService;
import com.ksyun.campus.metaserver.storage.MetadataStore;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;

/**
 * MetaServer初始化服务实现类
 * 负责在MetaServer启动时执行必要的初始化操作
 * 包括元数据存储初始化、文件系统根目录创建等
 */
@Slf4j
@Service
public class MetaServerInitServiceImpl implements IMetaServerInitService {
    
    /**
     * 元数据存储服务，用于启动和初始化底层存储
     */
    @Autowired
    private MetadataStore metadataStore;
    
    /**
     * 元数据服务，用于初始化文件系统根目录
     */
    @Autowired
    private IMetaService metaService;
    
    /**
     * 元数据同步服务，用于通知元数据存储准备就绪
     */
    @Autowired
    private MetadataSyncService metadataSyncService;
    
    /**
     * 初始化MetaServer服务
     * 在应用程序启动完成后自动调用
     * 执行以下操作：
     * 1. 启动元数据存储（如RocksDB）
     * 2. 初始化文件系统，创建根目录（如果不存在）
     * 
     * 如果初始化失败，将终止应用程序
     * 
     * @return 初始化是否成功
     */
    @EventListener(ApplicationReadyEvent.class)
    @Override
    public boolean initialize() {
        try {
            log.info("Initializing MetaServer");
            
            // 启动元数据存储
            metadataStore.start();
            
            // 通知同步服务元数据存储已准备好
            metadataSyncService.markMetadataStoreReady();
            
            // 初始化文件系统，如果需要则创建根目录
            metaService.initializeFileSystem();
            
            log.info("MetaServer initialization completed");
            return true;
            
        } catch (Exception e) {
            log.error("Failed to initialize MetaServer", e);
            System.exit(1);
            return false;
        }
    }
}
